const db = require('../db/index')//引入数据库
const bcrypt = require('bcryptjs')//引入加密中间件
const jwt = require('jsonwebtoken')//引入jwt中间件,用于生成token
const jwtconfig = require('../jwt_config/index')//引入jwt配置文件,用于加密和解密

exports.register = (req, res) => {//req是前端传过来的数据,res是后端返回的数据
  const reginfo = req.body//req.body是post请求的数据
  if (!reginfo.account || !reginfo.password) {//判断账号和密码是否为空
    return res.send({
      status: 1,
      message: '账号或者密码不能为空'
    })
  }
  //判断前端传过来的账号有没有已经存在在数据表中
  const sql = 'select * from users where account = ?'
  db.query(sql, reginfo.account, (err, result) => {
    if (result.length > 0) {
      return res.send({
        status: 1,
        message: '账号已经存在'
      })
    }

    reginfo.password = bcrypt.hashSync(reginfo.password, 10) //对密码进行加密,需要使用加密中间件bcrypt.js,第二个参数是加密后的长度
    const sql1 = 'insert into users set ?'
    const identity = '用户'
    const create_time = new Date()
    db.query(sql1, {
      account: reginfo.account, password: reginfo.password, identity, create_time, status: 0,//初始未冻结状态为0
    }, (err, results) => {
      if (results.affectedRows !== 1) {//过 results.affectedRows 属性可以判断新增数据是否成功
        return res.send({ status: 1, message: '注册失败' });
      }
      res.send({
        status: 0,
        message: '注册成功'
      })
    })
  })
}


exports.login = (req, res) => {
  const logininfo = req.body
  const sql = 'select * from users where account = ?'
  db.query(sql, [logininfo.account], (err, result) => {
    if (err) return res.ce(err) //执行sql语句失败的情况,一般在数据库断开的情况会执行失败
    if (result.length !== 1) return res.ce('登录失败')
    const compareResult = bcrypt.compareSync(logininfo.password, result[0].password) //比较前端传过来的密码和数据库中的密码是否相同
    if (!compareResult) return res.ce('登录失败')
    if (result[0].status == 1) return res.ce('账号已冻结')
    const user = {//剔除加密后的密码,头像,创建时间,更新时间
      ...result[0],
      password: '',
      imageUrl: '',
      create_time: '',
      update_time: '',
    }
    const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: '7h' })// 第一个参数是要加密的数据,第二个参数是密钥,第三个参数是过期时间
    res.send({
      results: result[0],
      status: 0,
      message: '登录成功',
      token: 'Bearer ' + tokenStr,//token需要加上Bearer
    })
  })
}
